﻿#include "biz.h"
#include "ui_biz.h"

Biz::Biz(QWidget *parent) :
    BizEditor(parent),
    ui(new Ui::Biz)
{
    ui->setupUi(this);

    table = TD_LEND;
    model=new QSqlTableModel(this);
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    ui->tableView->setModel(model);
    ui->tableView->setEditTriggers(QTableView::NoEditTriggers);

    if(loadColumnWidth())
        loadColumnWidthFlag=true;

    updateView();
    createMenu();
}

Biz::~Biz()
{
    delete ui;
}

void Biz::updateView()
{
    updateViewUnfinish();
}

void Biz::createMenu()
{
    menu=new QMenu(this);
    generateMenu();
}

void Biz::generateMenu()
{
    menu->addAction(QStringLiteral("添加..."),this,&Biz::newItem);
    menu->addSeparator();
    menu->addAction(QStringLiteral("未完成记录"),this,&Biz::updateView);
    menu->addAction(QStringLiteral("所有记录"),this,&Biz::updateViewAll);
    menu->addSeparator();
    menu->addAction(QStringLiteral("查找..."),this,&Biz::search);
    menu->addSeparator();
    menu->addAction(QStringLiteral("【取消】"),this,&Biz::en_cancel);

    if(part != "sd")
    {
        menu->addAction(QStringLiteral("【已拿走】"),this,&Biz::en_token);
        menu->addAction(QStringLiteral("【报损】"),this,&Biz::en_loss);
        menu->addSeparator();
        menu->addAction(QStringLiteral("进入编辑模式"),this,&Biz::edit_on);
    }
}

void Biz::en_remove()
{
    QModelIndex index=ui->tableView->currentIndex();
    if(index.isValid())
    {
        QModelIndex mIndex=index.sibling(index.row(),6);
        removeItem(mIndex);
    }
}

void Biz::en_cancel()
{
    QModelIndex index=ui->tableView->currentIndex();
    if(index.isValid())
    {
        QSqlRecord record=model->record(index.row());
        int id=record.value("id").toInt();
        if(getStatus(table,id) != ST_WAIT)
        {
            QMessageBox::warning(this,QStringLiteral("状态无效"),QStringLiteral("只有【等待处理】才可以取消！"));
            return;
        }

        QString host=getValue(table,"host",id);
        if(!host.isEmpty() && host != Env::hostName )
        {
            QMessageBox::warning(this,QStringLiteral("无权操作"),QStringLiteral("您无权操作他人的记录！"));
            return;
        }
        changeStatus(table,ST_CANCEL,id);
        updateView();
    }
}

void Biz::en_token()
{
    QModelIndex index=ui->tableView->currentIndex();
    if(index.isValid())
    {
        QSqlRecord record=model->record(index.row());
        int id=record.value("id").toInt();
        if(getStatus(table,id) != ST_WAIT)
            return;

        changeStatus(table,ST_TOKEN,id);
        updateView();
    }
}

void Biz::en_loss()
{
    QModelIndex index=ui->tableView->currentIndex();
    if(index.isValid())
    {
        QSqlRecord record=model->record(index.row());
        int id=record.value("id").toInt();

        if(getStatus(table,id) != ST_TOKEN)
        {
            QMessageBox::warning(this,QStringLiteral("状态错误"),QStringLiteral("只有【未归还】才可以报损！"));
            return;
        }

        QString name=record.value("name").toString();
        QString number=record.value("number").toString();
        QString receiver=QStringLiteral("借阅报损");
        QString host=record.value("host").toString();
        QString remark=QStringLiteral("来源：") + host;

        QSqlQuery query;
        query.prepare("insert into td_loss (date,name,number,receiver,remark,status) values (?,?,?,?,?,?)");
        query.addBindValue(Env::today);
        query.addBindValue(name);
        query.addBindValue(number);
        query.addBindValue(receiver);
        query.addBindValue(remark);
        query.addBindValue(ST_WAIT);
        if(query.exec())
        {
            changeStatus(table,ST_FINISH,id);
            updateView();
            sendMsg(T_LOSS,LOSS_NOTICE);
        }
    }
}

void Biz::en_finish()
{
    QModelIndex index=ui->tableView->currentIndex();
    if(index.isValid())
    {
        QModelIndex mIndex=index.sibling(index.row(),5);
        model->setData(mIndex,ST_FINISH);
    }
}

bool Biz::loadColumnWidth()
{
    if(!QFile::exists(userLand + ETC_BIZ))
        return false;
    else
    {
        QSettings set(userLand + ETC_BIZ,QSettings::IniFormat);
        int width=set.value("Biz/width").toInt();
        int height=set.value("Biz/height").toInt();
        if(width >= 720 && height >= 480)
            this->resize(width,height);

        colWidth.insert(1,set.value("BizColumnWidth/date").toInt());
        colWidth.insert(2,set.value("BizColumnWidth/name").toInt());
        colWidth.insert(3,set.value("BizColumnWidth/number").toInt());
        colWidth.insert(4,set.value("BizColumnWidth/host").toInt());
        colWidth.insert(5,set.value("BizColumnWidth/status").toInt());
        return true;
    }
}

void Biz::saveColumnWidth()
{
    QSettings set(userLand + ETC_BIZ,QSettings::IniFormat);
    set.setValue("Biz/width",this->width());
    set.setValue("Biz/height",this->height());

    set.setValue("BizColumnWidth/date",ui->tableView->columnWidth(1));
    set.setValue("BizColumnWidth/name",ui->tableView->columnWidth(2));
    set.setValue("BizColumnWidth/number",ui->tableView->columnWidth(3));
    set.setValue("BizColumnWidth/host",ui->tableView->columnWidth(4));
    set.setValue("BizColumnWidth/status",ui->tableView->columnWidth(5));
}

void Biz::setHeaderData()
{
    ui->tableView->hideColumn(0);
    model->setHeaderData(1,Qt::Horizontal,QStringLiteral("日期"));
    model->setHeaderData(2,Qt::Horizontal,QStringLiteral("名称"));
    model->setHeaderData(3,Qt::Horizontal,QStringLiteral("数量"));
    model->setHeaderData(4,Qt::Horizontal,QStringLiteral("借阅人"));   //host
    model->setHeaderData(5,Qt::Horizontal,QStringLiteral("状态"));    //status
    model->setHeaderData(6,Qt::Horizontal,QStringLiteral("备注"));    //remark

    if(loadColumnWidthFlag)
    {
        QMap<int,int>::const_iterator itor;
        for(itor = colWidth.constBegin(); itor != colWidth.constEnd(); itor++ )
        {
            int width=itor.value();
            if(width <= 0)
                width=100;
            else if(width >= this->width())
                width =200;

            ui->tableView->setColumnWidth(itor.key(),width);
        }
    }
}

void Biz::newItem()
{
    BizAdd bizAdd;
    bizAdd.move(this->x() + 50,this->y() + 50);
    if(bizAdd.exec() == QDialog::Accepted)
        updateView();
}

void Biz::edit_on()
{
    isEdit=true;
    ui->tableView->setEditTriggers(QTableView::DoubleClicked);
    updateMenu();
}

void Biz::edit_off()
{
    isEdit=false;
    ui->tableView->setEditTriggers(QTableView::NoEditTriggers);
    updateMenu();
}

void Biz::on_tableView_doubleClicked(const QModelIndex &)
{
    if(!isEdit)
        newItem();
}
